﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using System.Data.SqlClient;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using webapp4U;
using System.Data.OleDb;

public partial class UserControl_ControlImportNMDV2 : System.Web.UI.UserControl
{
    string strconn = webapp4U.Configuration.CurrentConnectionString;
    string error = "";
    ClassExecute.ClassExecute dt;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            chpreMonth.Text = "Check vào đây nếu bạn muốn cập nhật file dữ liệu cho tháng:" + DateTime.Now.AddMonths(-1).ToString("MM/yyyy");

        }

    }
    void ShowMessageBox(string text)
    {
        MessageBox.Text = text;
        MessageBox.ShowOnPageLoad = true;
    }
    bool CheckFileName(string filename)
    {
        dt = new ClassExecute.ClassExecute();

        // Tìm YyyyMm
        string YyyyMm = DateTime.Now.ToString("yyyyMM");
        if (chpreMonth.Checked)
        {
            YyyyMm = DateTime.Now.AddMonths(-1).ToString("yyyyMM");
        }
        else
        {
            YyyyMm = DateTime.Now.ToString("yyyyMM");
        }

        string dtFileNameCopy = dt.GetDataDepend(strconn, "k_checkFileNameDulicated", CommandType.StoredProcedure, ref error,
                       new SqlParameter("@FileNameOrginaly", filename),
                       new SqlParameter("@SiteCode", "FM_00000002"),
                       new SqlParameter("@YyyyMm", YyyyMm));
        //step 1 kiểm tra file trùng file name

        if (dtFileNameCopy == "OK")
        {
            return true;
        }
        else
        {
            return false;

        }

    }
    protected void btnUpload_Click(object sender, EventArgs e)
    {
        dt = new ClassExecute.ClassExecute();

        try
        {

            //check file browsed or not
            if (!fuUpload.HasFile)
            {
                ShowMessageBox("Bạn chưa chọn file để up load");
                return;
            }
            else if (!checkTypeFile())
            {
                ShowMessageBox("Không đúng định dạng file excel");
                return;
            }
            else
            {

                if (ViewState["FileName"] != null)
                {
                    ViewState["FileName"] = "";
                }
                ViewState["FileName"] = fuUpload.FileName;
                //step 1.1 đưa file vào server
                fuUpload.SaveAs(webapp4U.Globals.PhysicalApplicationPath() + @"/UserUpload/UploadTempFileExcel/" + ViewState["FileName"].ToString());

                //step 1.2 kiểm tra file name có trùng hay không
                bool BoolcheckFileName = CheckFileName(ViewState["FileName"].ToString());

                if (BoolcheckFileName)
                {
                    //có file name trùng
                    MessageBoxFileDuplicate.ShowOnPageLoad = true;
                }
                else
                {
                    //nếu file không trùng thì nhảy tới bước 2
                    Step2();

                }
            }
        }
        catch (Exception ex)
        {
            string method = System.Reflection.MethodBase.GetCurrentMethod().Name;
            dt.WriteErrorLog(Server.MapPath(webapp4U.Globals.LogUrl()), ex.Message, method);
        }
    }
    string MakeRandom()
    {


        string date = "NMD_" + DateTime.Now.ToString("yyyyMMdd") + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString();

        return date;

    }
    void Step2()
    {
        dt = new ClassExecute.ClassExecute();
        try
        {


            // Check Folder exists or not
            string YyyyMm = DateTime.Now.ToString("yyyyMM");
            if (chpreMonth.Checked)
            {
                YyyyMm = DateTime.Now.AddMonths(-1).ToString("yyyyMM");
            }
            else
            {
                YyyyMm = DateTime.Now.ToString("yyyyMM");
            }

            string pathFolder = webapp4U.Globals.PhysicalApplicationPath() + @"UserUpload/ImportedFileExcel/" + YyyyMm;
            DirectoryInfo dInfo = new DirectoryInfo(pathFolder);
            if (!dInfo.Exists)
            {
                dInfo.Create();
            }

            //Đổi tên file
            string fileNameDestination = MakeRandom()  + "_" + ViewState["FileName"].ToString();


            //Move file to ImportedFileExcelYyyyMm        
            string filePathSource = webapp4U.Globals.PhysicalApplicationPath() + @"/UserUpload/UploadTempFileExcel/" + ViewState["FileName"].ToString();
            string filePathDes = pathFolder + @"/" + fileNameDestination;
            File.Move(filePathSource, filePathDes);

            //lưu biến tạm
            ViewState["Path"] = filePathDes;


            //import vào sql server table TempImportNMD username
            Excel2Sql(ViewState["Path"].ToString(), fileNameDestination);


        }
        catch (Exception ex)
        {
            string method = System.Reflection.MethodBase.GetCurrentMethod().Name;
            dt.WriteErrorLog(Server.MapPath(webapp4U.Globals.LogUrl()), ex.Message, method);
        }
    }
    protected void btnOk_Click(object sender, EventArgs e)
    {
        //Vượt qua step 1,đi tới step 2 để kiểm tra nội dung file name  
        MessageBoxFileDuplicate.ShowOnPageLoad = false;

        Step2();

    }
    protected void btnCancel_Click(object sender, EventArgs e)
    {
        //Cancel luôn
        File.Delete(webapp4U.Globals.PhysicalApplicationPath() + @"/UserUpload/UploadTempFileExcel/" + ViewState["FileName"].ToString());
        MessageBoxFileDuplicate.ShowOnPageLoad = false;
    }
    protected void btnImport_Click(object sender, EventArgs e)
    {
        try
        {
            if ((ViewState["FileName"] == null) || ViewState["FileName"].ToString() == "")
            {
                ShowMessageBox("Đề nghị bạn chọn file excel và upload");

            }
            else
            {
                //Kiểm tra ,cập nhật dữ liệu và import vào table InvoiceDetail
                string kq = CheckIvalidData();

                if (kq == "Not")
                {
                    ViewState["Path"] = null;
                    ViewState["FileName"] = null;
                    ShowMessageBox("Bạn đã import thành công dữ liệu của NMD");
                    //khi import dữ liệu thành công thì tiến hành cập nhật lại tồn kho
                    UpdateTonKho();
                }
                else if (kq == "NotInMonth")
                {
                    File.Delete(ViewState["Path"].ToString());
                    if (chpreMonth.Checked)
                    {
                        ViewState["Path"] = null;
                        ViewState["FileName"] = null;
                        ShowMessageBox("Nội dung dữ liệu không nằm ở tháng:" + DateTime.Now.AddMonths(-1).ToString("MM/yyyy") + ",file excel này không thể input vào hệ thống và đã bị xóa,đề nghị bạn cập nhật lại đầy đủ trước khi import");
                    }
                    else
                    {
                        ViewState["Path"] = null;
                        ViewState["FileName"] = null;
                        ShowMessageBox("Nội dung dữ liệu không nằm ở tháng hiện hành,file excel này không thể input vào hệ thống và đã bị xóa,đề nghị bạn cập nhật lại đầy đủ trước khi import");
                    }
                }
                else if (kq == "OK")
                {
                    File.Delete(ViewState["Path"].ToString());
                    ViewState["Path"] = null;
                    ViewState["FileName"] = null;
                    ShowMessageBox("Nội dung dữ liệu không hợp lệ,file excel này không thể input vào hệ thống và đã bị xóa,đề nghị bạn cập nhật lại đầy đủ trước khi import");

                }
                else if (kq == "NotFile")
                {

                    ShowMessageBox("Đề nghị bạn chọn file excel và upload");
                }
                else
                {
                    ShowMessageBox(error);
                }
               
            }
        }
        catch
        {
            return;
        }
    }
    void Excel2Sql(string path, string fileName)
    {
        dt = new ClassExecute.ClassExecute();
        OleDbConnection oconn = null;
        try
        {
            //Kiểm tra table TempImportNMD' + @UserName có tồn tại hay không,nếu chưa thì tạo,nếu có thì delete
            bool kq = dt.ExecuteSQl_bool(strconn, CommandType.StoredProcedure, "[TTr_TempImportNMD_Delete]", ref error,
                new SqlParameter("@UserName", Session["user"].ToString()));

            oconn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +
                path + ";Extended Properties=Excel 12.0;Persist Security Info=False;");

            //đổ dữ liệu của file excel vào table TempImportNMD' + @UserName
            string sql = "select KHO,MSVT,MKH,TENKH,DC,QHT,MAQUAN,CTYPE,LAND,PHIEU as INVOICE,NGAY,QTY";
            sql = sql + ",DGLE,TT,TTV,NGUYENGIA,'FM_00000002' as SiteCode,'" + fileName + "' as FileName,'" + Session["user"].ToString() + "' as UserImport,'S' as trntyp,DISC*100 from [BCNgay$]";

            OleDbCommand ocmd = new OleDbCommand(sql, oconn);
            oconn.Open();
            OleDbDataAdapter da = new OleDbDataAdapter(ocmd);
            DataTable dbTest = new DataTable();
            da.Fill(dbTest);
            oconn.Close();

            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(strconn))
            {

                bulkCopy.BatchSize = 500;
                bulkCopy.NotifyAfter = 1000;

                bulkCopy.DestinationTableName = "dbo.TempImportNMD" + Session["user"].ToString();
                bulkCopy.WriteToServer(dbTest);

            }

            ShowMessageBox("Bạn đã upload file thành công,đề nghị bạn nhấn nút import để cập nhật số liệu");
        }
        catch (DataException ex)
        {

            string method = System.Reflection.MethodBase.GetCurrentMethod().Name;
            dt.WriteErrorLog(Server.MapPath(webapp4U.Globals.LogUrl()), ex.Message, method);

        }
        finally
        {
            // Clean up.
            if (oconn != null)
            {
                oconn.Close();
                oconn.Dispose();
            }
        }


    }
    string CheckIvalidData()
    {
        //nếu check dữ liệu không có vấn đề gì thì import vào table invoiceDetail luôn --store TTr_TempImportDKSH_CheckInValid
        dt = new ClassExecute.ClassExecute();
        string i = "Not";
        try
        {
            if ((ViewState["FileName"] != null) || ViewState["FileName"].ToString() != "")
            {
                // Tìm YyyyMm
                string YyyyMm = DateTime.Now.ToString("yyyyMM");
                if (chpreMonth.Checked)
                {
                    YyyyMm = DateTime.Now.AddMonths(-1).ToString("yyyyMM");
                }
                else
                {
                    YyyyMm = DateTime.Now.ToString("yyyyMM");
                }

                i = dt.GetDataDepend(strconn, "[TTr_TempImportNMD_CheckInValid]", CommandType.StoredProcedure, ref error,
                    new SqlParameter("@UserName", Session["user"].ToString()),
                    new SqlParameter("@OrdinaryFileName", ViewState["FileName"].ToString()),
                    new SqlParameter("@YyyyMm", YyyyMm));
            }
            else
            {
                i = "NotFile";
            }

        }
        catch (Exception ex)
        {

            string method = System.Reflection.MethodBase.GetCurrentMethod().Name;
            dt.WriteErrorLog(Server.MapPath(webapp4U.Globals.LogUrl()), ex.Message, method);

        }
        return i;

    }
    [STAThread]
    void UpdateTonKho()
    {
        dt = new ClassExecute.ClassExecute();
        try
        {
             string YyyyMm = DateTime.Now.ToString("yyyyMM");
                if (chpreMonth.Checked)
                {
                    YyyyMm = DateTime.Now.AddMonths(-1).ToString("yyyyMM");
                }
                else
                {
                    YyyyMm = DateTime.Now.ToString("yyyyMM");
                }

            dt.ExecuteSQl_bool(strconn, CommandType.StoredProcedure, "[k_CapNhatTonKhoNMD]", ref error,
                new SqlParameter("@UserName", Session["user"].ToString()),
                new SqlParameter("@YyyyMm", YyyyMm));
            dt.ExecuteSQl_bool(strconn, CommandType.StoredProcedure, "[k_PreUpdateTonKhoNMD]", ref error,
              new SqlParameter("@YyyyMm", YyyyMm));
        }
        catch (Exception ex)
        {
            string method = System.Reflection.MethodBase.GetCurrentMethod().Name;
            dt.WriteErrorLog(Server.MapPath(webapp4U.Globals.LogUrl()), ex.Message, method);
        }
    }
    bool checkTypeFile()
    {
        string[] validFileTypes = { "xlsx", "xls" };
        string ext = System.IO.Path.GetExtension(fuUpload.PostedFile.FileName);
        bool isValidFile = false;
        for (int i = 0; i < validFileTypes.Length; i++)
        {
            if (ext == "." + validFileTypes[i])
            {
                isValidFile = true;
                break;
            }
        }
        if (!isValidFile)
        {
            return false ;
        }
        else
        {
            return true;
        }
    }
}